function varargout = computeModelMetrics(modelName, varargin)
% 函数功能：计算模型的度量指标
%   computeModelMetrics 计算模型的度量指标，然后生成Model Advisor报告
%
%   语法：
%   computeModelMetrics(ModelName)
%   computeModelMetrics(ModelName, 'TreatAsTopMdl')
%
%   输入参数：
%   modelName - 要分析的Simulink模型名称
%   varargin - 可选参数，用于指定是否作为顶层模型处理
%
%   输出参数：
%   varargout - 可变输出参数，包含分析结果结构体
%
%   

% 检查Simulink Check许可证是否可用
if ~dig.isProductInstalled('Simulink Check')
    error('A Simulink Check license is not available.');
end

% 关闭所有已打开的模型
bdclose('all');

% 对于computeModelMetrics，始终使用DEV格式，因为此函数没有CI模式
reportFormat = getReportFormatConfig('model metrics', 'DEV');

% 设置报告参数
reportName = ProjectNamingManager.getNameStr('model metrics report', modelName);  % 报告名称
reportPath = ProjectPathManager.getDirPath('model metrics', modelName);        % 报告路径

% 删除已存在的旧报告文件
reportExtensions = {'pdf', 'html'};  % 支持的报告格式扩展名
for ext = reportExtensions
    oldFile = fullfile(reportPath, [reportName, '.', ext{1}]);  % 构建旧报告文件路径
    if exist(oldFile, 'file')
        delete(oldFile);  % 如果文件存在则删除
    end
end

% 检查模型启动脚本是否存在
if ~exist(ProjectNamingManager.getNameStr('load command', modelName), 'file')
    error(['Model startup script ''', ProjectNamingManager.getNameStr('load command', modelName), ''' not found.']);
end

% 打开Simulink模型
disp(['Opening Simulink model ', modelName, '.']);
evalin('base', ProjectNamingManager.getNameStr('load command', modelName));

% 模型度量的配置文件
configFile = 'modelMetrics.json';

try
    % 使用MATLAB 2023b API运行Model Advisor
    if exist(configFile, 'file')
        % 如果配置文件存在，使用配置文件方法
        checkResult = ModelAdvisor.run(modelName, ...
            'Configuration', configFile, ...      % 指定配置文件
            'Force', 'on', ...                    % 强制运行检查
            'ReportFormat', reportFormat, ...     % 报告格式
            'ReportPath', reportPath, ...         % 报告路径
            'ReportName', reportName);            % 报告名称
    else
        % 如果配置文件不存在，使用默认的模型度量检查
        warning('Configuration file not found. Using default Model Advisor checks.');
        checkResult = ModelAdvisor.run(modelName, ...
            'Force', 'on', ...                    % 强制运行检查
            'ReportFormat', reportFormat, ...     % 报告格式
            'ReportPath', reportPath, ...         % 报告路径
            'ReportName', reportName);            % 报告名称
    end
    
    % 使用MATLAB 2023b API生成摘要报告
    ModelAdvisor.summaryReport(checkResult);
    
    % 基于规则第2条：验证报告文件是否真正生成（不使用silent fallback）
    fullReportPath = fullfile(reportPath, [reportName, '.', reportFormat]);  % 完整报告路径
    if ~exist(fullReportPath, 'file')
        % 报告文件不存在，明确报告错误（规则第2条）
        % 使用格式化字符串避免路径中的反斜杠被解释为转义字符
        error('computeModelMetrics:ReportNotGenerated', ...
            'Model metrics report was not generated. Expected file: %s. Please check if ModelAdvisor.run() executed correctly and the report path is accessible.', ...
            fullReportPath);
    end
    
    % 报告文件确实存在，设置成功消息
    result.Message = ['Model metrics report for ', modelName, ' is successfully generated.'];
    
    % 由于此函数通常在DEV模式下使用，所以总是打开报告
    try
        % 根据操作系统选择不同的打开方式
        if ispc
            winopen(fullReportPath);  % Windows系统
        elseif ismac
            system(['open "' fullReportPath '"']);  % macOS系统
        else
            system(['xdg-open "' fullReportPath '"']);  % Linux系统
        end
    catch openErr
        % 基于规则第2条：明确报告打开失败（但不影响整体成功）
        warning('computeModelMetrics:CannotOpenReport', ...
            'Report generated successfully but could not be opened automatically: %s', openErr.message);
    end
    
catch ME
    % 如果发生错误，关闭模型
    close_system(modelName, 0);
    rethrow(ME);  % 重新抛出异常
end

% 关闭Simulink模型
disp(['Closing Simulink model ', modelName, '.']);
close_system(modelName, 0);

% 如果有输出参数，则设置返回值
if nargout > 0
    varargout{1} = result;
end
% 显示结果消息
disp(result.Message);

end
